#include "ximagepro.h"
#include <opencv2/highgui.hpp>
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>

using namespace cv;
XImagePro::XImagePro() {}

void XImagePro::Set(Mat mat1, Mat mat2)
{

    this->src1 = mat1;
    this->src2 = mat2;

    this->src1.copyTo(des);

}

void XImagePro::Gain(double bright, double constrast)
{

    des.convertTo(des,-1,constrast,bright);
}

void XImagePro::rotate90()
{
    if(des.empty()) return;
    rotate(des,des,ROTATE_90_CLOCKWISE);

}

void XImagePro::rotate180()
{

    if(des.empty()) return;
    rotate(des,des,ROTATE_180);

}

void XImagePro::rotate270()
{

    if(des.empty()) return;
    rotate(des,des,ROTATE_90_COUNTERCLOCKWISE);
}

void XImagePro::flipX()
{
    if(des.empty()) return;
    flip(des,des,0);
}

void XImagePro::flipY()
{
    if(des.empty()) return;
     flip(des,des,1);
}

void XImagePro::flipXY()
{

    if(des.empty()) return;
     flip(des,des,-1);
}

void XImagePro::Resize(int width, int height)
{
    if(des.empty()) return;
    resize(des,des,Size(width,height));

}

void XImagePro::PyDown(int count)
{
    if(des.empty()) return;
    for(int i=1;i<count;i++){
        pyrDown(des,des);
    }
}

void XImagePro::PyUp(int count)
{
    if(des.empty()) return;
    for(int i=1;i<count;i++){
        pyrUp(des,des);
    }

}

void XImagePro::Clip(int x, int y,int w, int h)
{
    if(des.empty()) return;

    if(x< 0 ||y < 0 || w <=0 || h<= 0)
    {
        return;
    }
    if(x>des.cols || y>des.rows ) return;

    des =des(Rect(x,y,w,h));




}

void XImagePro::Gray()
{
    if(des.empty()) return;
    cvtColor(des,des,COLOR_BGR2GRAY);
}

void XImagePro::Mark(int x, int y, double a)
{
    if(des.empty()) return;
    if(src2.empty()) return;
    Mat rol = des(Rect(x,y,src2.cols,src2.rows));
    addWeighted(src2,a,rol,1-a,0,rol);
}
//融合
void XImagePro::Blend(double a)
{
    if(des.empty()) return;
    if(src2.empty()) return;

    if(src2.size() != des.size())
    {
        resize(src2,src2,des.size());
    }

    addWeighted(src2,a,des,1-a,0,des);

}

//合并
void XImagePro::Merge()
{
    if(des.empty()) return;
    if(src2.empty()) return;

    if(src2.size() != des.size())
    {
        int w =  src2.cols * ((double)src2.rows/(double)des.rows);
        resize(src2,src2,Size(w,des.rows));
    }

    int dw = des.cols + src2.cols;
    int dh = des.rows;

    des = Mat(Size(dw,dh),src1.type());

    Mat r1 = des(Rect(0,0,src1.cols,dh));
    Mat r2 = des(Rect(src1.cols,0,src2.cols,dh));

    src1.copyTo(r1);
    src2.copyTo(r2);
}
